<?php

       defined('ACC') || exit('Acc deined');

       //model的模板，表的模型继承该模型
  class Model{
             protected  $table = NULL;    // 是model所控制的表
             protected $db = NULL;    // 引入mysql对象
             protected $pk = 'id';
             protected $fields = array();
             protected $rule = [];
             protected $err = [];

             public  function  __construct(){
                 $this->db = mysql::getIns();
             }

       /**
           负责把传来的数组
           清除掉不用的单元
           留下与表的字段对应的单元
           思路：
             循环数组，分别判断其键(key),是否是表的字段
              当然，要先定义或者获取表的字段（我这边直接手动定义）
        */
         //处理表单接收到的数据
        function shiftData($data){
          $dd = array();
           foreach ($data as $key => $value) {
               if(in_array($key,$this->fields)){
                      if ($key == 'goods_weight') {
                            if($value){
                                $dd[$key] =$value * $data['weight_unit']; 
                            }
                            
                        }else{
                            $dd[$key] = $value;
                      }
               }
            }
            return $dd;
         }

           /**
               增加
           **/
             public function add($data){
//                 var_dump($data);
                   return $this->db->autoExecute($this->table,$data,'insert');
             }

           /**
               删除
               return 收影响的行数
           **/
             function del($id){
                  $sql = 'delete from ' . $this->table . 'where ' . $this->pk . '=' . $id;
                  return $this->db->query($sql);
             }

            /**
                更新
            **/
             function update($data,$id){
                 $sql = ' where ' . $this->pk . '=' . $id;
                 return $this->db->autoExecute($this->table,$data,'update',$sql);
             }

          /**
               获取全部数据
               return Array
           **/
             public function select(){
                 $sql = 'select * from ' . $this->table;
                  return $this->db->getAll($sql);
             }

           /**
              查找单行数据
           **/  
           public function find($id){
               $sql = 'select * from ' . $this->table . ' where ' . $this->pk . '=' . $id . ' '.'order By  "' . $this->pk . '" desc';
               return $this->db->getRow($sql);
           }


          /**
           * 获取 最新的自增列 auto_increment 的自增长值
           */
          public function insertId(){
              return $this->db->insert_id();
          }



         /**
           添加验证规则
           分为几种情况下的验证规则 
           0，可以不填但是填了就要接受 后面定义的验证
           1，不能为空
           2，如果有，且内容不为空， 就要接受后面定义的规则的验证

          ['goods_name',1,'商品名不能为空','required'],
          ['goods_brief',2,'商品描述必须在10-100个字符之间','between'],
          ['is_new',0,'是否新品只能是0或1','in','0,1'],

                 ？能不能同时验证多个规则了？？  ***现在还不能
                 我好像有点明白了，这里的0，1，2三种类型 其实就是在做规则验证了，然后后面的规则还可以 再做一次验证。
                 比如定义了类型是1，后面的规则是numeric , 就是说先不能为空，还的是数值型
          */
         public function _validate($data){
                // print_r('hello world');
              
            if(empty($this->rule)){
                  return true;
             }

            foreach($this->rule as $k=>$v){
                  switch($v[1]){
                      case 0:
                           if(!empty($data[$v[0]])){
                               if(!$this->check($data[$v[0]],$v[3],$v[4],$v[0])){
                                  $this->err[] = $v[2];
                                  return false;
                               }
                           }
                          break;
                      case 1:
                        //判断是否非空非零，如果不是则返回false
                            if(isset($data[$v[0]]) && empty($data[$v[0]]) && $data[$v[0]] != '0'){
                               $this->err[] = $v[2];
                              return false;
                            }

                            //值不为空时，验证规则
                            if(!empty($data[$v[0]]) || $data[$v[0]] == '0'){ 
                              if(!$this->check($data[$v[0]],$v[3],$v[4],$v[0])){
                                 $this->err[] = $v[2];
                                  return false;
                               }
                            }
                        break;
                       case 2:
                             if(!empty($data[$v[0]]) && $data[$v[0]] !== ''){

                                if(!$this->check($data[$v[0]],$v[3],$v[4],$v[0])){
                                   $this->err[] = $v[2];
                                  return false;
                               }
                             }
                        break;
                  }
              }
                   return true;
           }

          public function getErr(){
                return $this->err;
          }

          /**
            根据验证规则，判断输入的数据是否合法
            @param   $value 传入的data值
            @param   $rule 验证规则（required , max 等）
            @param   $temp 验证规则制定值

            2019/11/22  添加唯一值验证，所以需添加 键名称传入值
            @param   $k 需验证值的字段名
          */
        protected function check($value,$rule,$temp,$k){
               // print_r($rule .'+'. $value); echo '<br />';
            switch($rule){
                  case 'required':
                             if(empty($value)){
                                return false;
                             }
                           break;
                  case 'numeric':
                             if(!is_numeric($value)){
                                  return false;
                             }
                           break;
                  case 'between':
                            $re = explode(',',$temp);
                            list($min,$max) = $re;
                            if(strlen($value) < $min || strlen($value) > $max){
                                return false;
                            } 
                            break;
                  case 'in':
                             $re = explode(',', $temp);
                             if(!in_array($value,$re)){
                                 return false;
                             }
                             break;
                  case 'unique':
                         //验证字段是否唯一，先查询在数据中是否有数据，原生查询数据 注意拼接空格，和字符串要“”引起来
            $sql ='select count("id") as num from ' . $this->table . ' where ' . $k .' = ' .'"'.$value.'"';
                            $re = $this->db->getRow($sql);
                            return $re['num']>0?false:true;
                            break;
                   case 'length':
                            $re = explode(',',$temp);
                            list($min,$max) = $re;
                            if(strlen($value)<$min || strlen($value)>$max){
                                return false;
                            }
                            break;  
                   case 'email':
                           //判断 $value是否是 email ，可以用系统函数filter_var();
                          return filter_var($value,FILTER_VALIDATE_EMAIL) !== false;

                         break;                                
             }
                 return true;
        }



  }



